package com.eudon.design_pattern.behavioral.visitor;

/**
 * @author eudon
 * @description 文本抽取访问者 - 访问者模式中的具体访问者
 * @date 2025/9/3
 * @email syd19970616@gmail.com
 * @address <a href="https://gitee.com/eudon">Gitee</a>
 */
public class Extractor implements Visitor {
    
    /**
     * 访问PDF文件，执行文本抽取操作
     * 根据PDF文件的特性（页数、是否包含图片）来执行相应的抽取逻辑
     * 
     * @param pdfFile PDF文件对象
     */
    @Override
    public void visit(PdfFile pdfFile) {
        System.out.println("=== 文本抽取器正在处理PDF文件 ===");
        System.out.println("文件信息: " + pdfFile.toString());
        
        // 根据PDF文件的特性执行不同的抽取策略
        if (pdfFile.hasImages()) {
            System.out.println("检测到图片内容，启用OCR文字识别技术...");
            System.out.println("正在从图片中提取文字内容...");
        }
        
        // 模拟按页抽取文本
        System.out.println("正在逐页抽取文本内容...");
        for (int i = 1; i <= Math.min(pdfFile.getPageCount(), 3); i++) {
            System.out.println("  - 第" + i + "页: 抽取到文本内容 [模拟数据]");
        }
        
        if (pdfFile.getPageCount() > 3) {
            System.out.println("  - ... (共" + pdfFile.getPageCount() + "页)");
        }
        
        // 计算预估的文本量
        int estimatedWords = pdfFile.getPageCount() * 300; // 假设每页300字
        System.out.println("抽取完成！预估文本量: " + estimatedWords + "字");
        System.out.println("文本已保存到: " + getExtractedFileName(pdfFile.getFileName(), "txt"));
        System.out.println();
    }
    
    /**
     * 访问PPT文件，执行文本抽取操作
     * 根据PPT文件的特性（幻灯片数量、动画效果）来执行相应的抽取逻辑
     * 
     * @param pptFile PPT文件对象
     */
    @Override
    public void visit(PPTFile pptFile) {
        System.out.println("=== 文本抽取器正在处理PPT文件 ===");
        System.out.println("文件信息: " + pptFile.toString());
        
        // 根据PPT文件的特性执行不同的抽取策略
        if (pptFile.hasAnimations()) {
            System.out.println("检测到动画效果，将抽取动画文本和备注内容...");
        }
        
        // 模拟按幻灯片抽取文本
        System.out.println("正在逐张幻灯片抽取文本内容...");
        for (int i = 1; i <= Math.min(pptFile.getSlideCount(), 3); i++) {
            System.out.println("  - 第" + i + "张幻灯片: 标题、正文、备注 [模拟数据]");
        }
        
        if (pptFile.getSlideCount() > 3) {
            System.out.println("  - ... (共" + pptFile.getSlideCount() + "张幻灯片)");
        }
        
        // 计算预估的文本量
        int estimatedWords = pptFile.getSlideCount() * 150; // 假设每张幻灯片150字
        System.out.println("抽取完成！预估文本量: " + estimatedWords + "字");
        System.out.println("演讲稿已保存到: " + getExtractedFileName(pptFile.getFileName(), "txt"));
        System.out.println();
    }
    
    /**
     * 访问Word文件，执行文本抽取操作
     * 根据Word文件的特性（字数、表格、图片）来执行相应的抽取逻辑
     * 
     * @param wordFile Word文件对象
     */
    @Override
    public void visit(WordFile wordFile) {
        System.out.println("=== 文本抽取器正在处理Word文件 ===");
        System.out.println("文件信息: " + wordFile.toString());
        
        // 根据Word文件的特性执行不同的抽取策略
        System.out.println("正在抽取文档正文内容...");
        System.out.println("已抽取正文: " + wordFile.getWordCount() + "字");
        
        if (wordFile.hasTables()) {
            System.out.println("检测到表格内容，正在抽取表格数据...");
            System.out.println("表格数据已转换为结构化文本");
        }
        
        if (wordFile.hasImages()) {
            System.out.println("检测到图片内容，正在抽取图片说明文字...");
            System.out.println("图片说明文字已提取");
        }
        
        // 显示版本兼容性信息
        System.out.println("文档版本: " + wordFile.getVersion() + " (完全兼容)");
        
        System.out.println("抽取完成！总文本量: " + wordFile.getWordCount() + "字");
        System.out.println("纯文本已保存到: " + getExtractedFileName(wordFile.getFileName(), "txt"));
        System.out.println();
    }
    
    @Override
    public String getVisitorName() {
        return "文本抽取器";
    }
    
    /**
     * 生成抽取后的文件名
     * @param originalFileName 原始文件名
     * @param newExtension 新扩展名
     * @return 抽取后的文件名
     */
    private String getExtractedFileName(String originalFileName, String newExtension) {
        int lastDotIndex = originalFileName.lastIndexOf('.');
        String baseName = lastDotIndex > 0 ? originalFileName.substring(0, lastDotIndex) : originalFileName;
        return baseName + "_extracted." + newExtension;
    }
}